package br.com.models;

import java.util.InputMismatchException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.springframework.stereotype.Component;

@Component
@Entity
@Table(name="Student")
@PrimaryKeyJoinColumn(name="id")

public class Student extends User{
	@NotNull @Size(min=9, max=9)
	private String registration;
	
	@NotNull @Size(min=11, max=12)
	private String cpf;
	
	@NotNull @Size(min=3)
	private String departament;
	
	public Student() {
		
		super();
		
		this.setType('e');
	}
	
	public String getRegistration() {
		return registration;
	}
	public void setRegistration(String registration) {
		this.registration = registration;
	}
	
	
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	

	public String getDepartament() {
		return departament;
	}
	public void setDepartament(String departament) {
		this.departament = departament;
	}
	
	public boolean isValidFormatEmail(String string) {
		// TODO Auto-generated method stub
		Pattern p = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$"); 
	    Matcher m = p.matcher(string); 
	    if (m.find()){
	      return true;
	    }
	    else{
	      return false;
	    }  
	}
	
	public boolean isValidPassword(String string) {
		// TODO Auto-generated method stub
		if (string.length()<6)
			return false;
		else 
			return true;
	}
	public boolean isValidNumber(String string) {
		// TODO Auto-generated method stub
		for (int i = 0; i < string.length(); i++) {  
	          char ch = string.charAt(i);  
	          if (ch < 48 || ch > 57)  
	               return false;  
	    }  
	    return true;
	}
	
	public boolean isValidName(String string) {
		// TODO Auto-generated method stub
		if (string.length()<1)
			return false;
		else 
			return true;
	}
	public boolean isValidFormatZipCode(String string) {
	
		// TODO Auto-generated method stub
		Pattern p = Pattern.compile("^[0-9]{5}-[0-9]{3}$"); 
		Matcher m = p.matcher(string);
		if (m.find()){
			return true;
		}
		else{
			return false;
		}

	}
	public boolean isValidCPF(String CPF) {
		// TODO Auto-generated method stub
		
		//considera-se erro CPF's formados por uma sequencia de numeros iguais 
		if (CPF.equals("00000000000") || CPF.equals("11111111111") || 
				CPF.equals("22222222222") || CPF.equals("33333333333") || 
				CPF.equals("44444444444") || CPF.equals("55555555555") || 
				CPF.equals("66666666666") || CPF.equals("77777777777") || 
				CPF.equals("88888888888") || CPF.equals("99999999999")) 
			return(false); 
		
		if (CPF.equals("000000000-00") || CPF.equals("111111111-11") || 
				CPF.equals("222222222-22") || CPF.equals("333333333-33") || 
				CPF.equals("444444444-44") || CPF.equals("555555555-55") || 
				CPF.equals("666666666-66") || CPF.equals("777777777-77") || 
				CPF.equals("888888888-88") || CPF.equals("999999999-99")) 
			return(false);
		
		if (CPF.length()<11 || CPF.length()>12)
			return(false);
		
		Pattern p = Pattern.compile("^[0-9]{9}-[0-9]{2}$"); 
		Matcher m = p.matcher(CPF);
		if (m.find()){
			char dig10, dig11; 
			int sm, i, r, num, peso; // "try" - protege o codigo para eventuais erros de conversao de tipo (int) 
			
			try { // Calculo do 1o. Digito Verificador 
				sm = 0; 
				peso = 10; 
				
				for (i=0; i<9; i++) { // converte o i-esimo caractere do CPF em um numero: // por exemplo, transforma o caractere '0' no inteiro 0 // (48 eh a posicao de '0' na tabela ASCII) 
					num = (int)(CPF.charAt(i) - 48); 
					sm = sm + (num * peso); 
					peso = peso - 1; 
				} 
				
				r = 11 - (sm % 11); 
				
				if ((r == 10) || (r == 11)) 
					dig10 = '0';
				else 
					dig10 = (char)(r + 48); // converte no respectivo caractere numerico 
				
				// Calculo do 2o. Digito Verificador 
				sm = 0; 
				peso = 11; 
				//091656666-82
				for(i=0; i<11; i++) {
					if (i==10)
					{
						
					}
					else{
					num = (int)(CPF.charAt(i) - 48); 
					sm = sm + (num * peso); 
					peso = peso - 1; 
					}
				} 
				
				r = 11 - (sm % 11); 
				
				if ((r == 10) || (r == 11)) 
					dig11 = '0'; 
				else 
					dig11 = (char)(r + 48); 
				
				// Verifica se os digitos calculados conferem com os digitos informados. 
				if ((dig10 == CPF.charAt(10)) && (dig11 == CPF.charAt(11))) 
					return(true); 
				else 
					return(false); 
				} catch (InputMismatchException erro) { 
					return(false); 
				} 
			
		}
		else{
			
			char dig10, dig11; 
			int sm, i, r, num, peso; // "try" - protege o codigo para eventuais erros de conversao de tipo (int) 
		
			try { // Calculo do 1o. Digito Verificador 
				sm = 0; 
				peso = 10; 
			
				for (i=0; i<9; i++) { // converte o i-esimo caractere do CPF em um numero: // por exemplo, transforma o caractere '0' no inteiro 0 // (48 eh a posicao de '0' na tabela ASCII) 
					num = (int)(CPF.charAt(i) - 48); 
					sm = sm + (num * peso); 
					peso = peso - 1; 
				} 
			
				r = 11 - (sm % 11); 
			
				if ((r == 10) || (r == 11)) 
					dig10 = '0';
				else 
					dig10 = (char)(r + 48); // converte no respectivo caractere numerico 
			
				// Calculo do 2o. Digito Verificador 
				sm = 0; 
				peso = 11; 
			
				for(i=0; i<10; i++) { 
					num = (int)(CPF.charAt(i) - 48); 
					sm = sm + (num * peso); 
					peso = peso - 1; 
				} 
			
				r = 11 - (sm % 11); 
			
				if ((r == 10) || (r == 11)) 
					dig11 = '0'; 
				else 
					dig11 = (char)(r + 48); 
			
				// Verifica se os digitos calculados conferem com os digitos informados. 
				if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) 
					return(true); 
				else 
					return(false); 
				} catch (InputMismatchException erro) { 
					return(false); 
				}
			}	
	}	

}
